import java.util.HashSet;
import java.util.Set;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec 中等
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

 * 思路：
 * 双指针
 * @since 2023-08-27 10:49
 */
public class _003无重复字符的最长子串 {
    public static void main(String[] args) {
        String s = "abcabcbb";
        System.out.println(lengthOfLongestSubstring(s));
    }
    public static int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<>();
        //双指针
        int l = 0, r = 0;
        int res = 0;
        while(r < s.length()){
            while(l < r && set.contains(s.charAt(r))){//[l,r] 包含重复字符
                //移动左指针
                set.remove(s.charAt(l));
                l++;
            }
            //记录 最长无重复 子串长度
            res = Math.max(res, r - l + 1);
            //继续移动右指针
            set.add(s.charAt(r));
            r++;
        }
        return res;
    }
}
